package io.yuanqi.hgtcshop.service;



import io.yuanqi.hgtcshop.entity.dos.GoodsSku;
import io.yuanqi.hgtcshop.entity.dos.Trade;
import io.yuanqi.hgtcshop.entity.dto.TradeDTO;
import io.yuanqi.hgtcshop.entity.enums.CartTypeEnum;
import io.yuanqi.hgtcshop.entity.vo.TradeParams;

import java.math.BigDecimal;
import java.util.List;

/**
 * 购物车业务层
 *
 * @author Chopper
 * @since 2020-03-23 12:29 下午
 */
public interface CartService {



    /**
     * 获取整个交易中勾选的购物车和商品
     *
     * @param way 获取方式
     * @return 交易信息
     */
    TradeDTO getCheckedTradeDTO(CartTypeEnum way);


    /**
     * 获取整个交易中勾选的购物车和商品
     *
     * @return 交易信息
     */
    TradeDTO getAllTradeDTO();

    /**
     * 购物车加入一个商品
     *
     * @param skuId    要写入的skuId
     * @param num      要加入购物车的数量
     * @param openId   那个用户
     * @param cover    是否覆盖购物车的数量，如果为否则累加，否则直接覆盖
     */
    void add(String skuId, Integer num, String openId, Boolean cover);





    /**
     * 批量删除
     *
     * @param skuIds 要写入的skuIds
     */
    void delete(String[] skuIds,String openId);

    /**
     * 清空购物车
     */
    void clean(String openId);



    /**
     * 选择收货地址
     *
     * @param shippingAddressId 收货地址id
     * @param way               购物车类型
     */
    void shippingAddress(String shippingAddressId, String way);



    /**
     * 获取购物车商品数量
     *
     * @param checked 是否选择
     * @return 购物车商品数量
     */
    Long getCartNum(Boolean checked);



    /**
     * 创建交易
     * 1.获取购物车类型，不同的购物车类型有不同的订单逻辑
     * 购物车类型：购物车、立即购买、虚拟商品、拼团、积分
     * 2.校验用户的收件人信息
     * 3.设置交易的基础参数
     * 4.交易信息存储到缓存中
     * 5.创建交易
     * 6.清除购物车选择数据
     *
     * @param tradeParams 创建交易参数
     * @return 交易信息
     */
    Trade createTrade(TradeParams tradeParams);

    List<GoodsSku> cartAll(String openId);

    Object createTrade(String openId, String[] skuIds, String addressId, BigDecimal totalPrice);
}
